package com.wlz.creational.singleton.hunger;

import java.io.Serializable;

/**
 * @author： wlz
 * @Date 2020/7/21 10:02
 * @description： TODO
 * @version: 1.0
 * 饿汉式 （静态常量）
 * 饿汉式在类加载时已经创建好该对象，在程序调用时直接返回该单例对象即可，
 * 即我们在编码时就已经指明了要马上创建这个对象，不需要等到被调用时再去创建。
 * 不会存在并发安全和性能问题。
 * 优点:写法简单。也没有线程同步问题，因为在类装载的时候就完成了实例化
 * 缺点：类装载的时候就完成了实例化，如果说一直没有用到这个实例，可能会造成内存中的浪费。
 * 可以用
 */
public class HungrySingleton implements Serializable {


    // step1:构造器私有化,防止用new创建实例
    private HungrySingleton() {
        if (singleton != null) {
            throw new RuntimeException("禁止通过反射创建对象");
        }
    }

    // step2:类的内部创建对象
    private static final HungrySingleton singleton = new HungrySingleton();


    // step3:提供一个public的静态方法，返回实例对象
    public static HungrySingleton getInstance() {
        return singleton;
    }

    public static void main(String[] args) {
        HungrySingleton oject1 = HungrySingleton.getInstance();
        HungrySingleton oject2 = HungrySingleton.getInstance();
        System.out.println(oject1.hashCode());
        System.out.println(oject2.hashCode());
    }

    //防止序列化工具
    public Object readResolve() {
        return (Object) singleton;
    }
}
